package com.demo.springai.model;

import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

/**
 * 聊天请求数据模型
 * 这个类用于接收客户端发送的聊天请求数据
 */
@Data  // Lombok注解：自动生成getter、setter、toString、equals、hashCode方法
@NoArgsConstructor  // 自动生成无参构造函数
@AllArgsConstructor  // 自动生成全参构造函数
public class ChatRequest {

    /**
     * 用户发送的消息内容
     * @NotBlank: 验证消息不能为空或仅包含空白字符
     * @Size: 限制消息长度，最少1个字符，最多2000个字符
     */
    @NotBlank(message = "消息内容不能为空")
    @Size(min = 1, max = 2000, message = "消息长度必须在1-2000个字符之间")
    @JsonProperty("message")  // JSON字段名映射
    private String message;

    /**
     * 指定使用的AI模型（可选）
     * 如果不指定，将使用配置文件中的默认模型
     */
    @JsonProperty("model")
    private String model;

    /**
     * 温度参数（可选）
     * 控制AI响应的随机性，范围0.0-2.0
     * 值越高，回答越有创意但可能不太准确
     * 值越低，回答越准确但可能比较单调
     */
    @JsonProperty("temperature")
    private Double temperature;

    /**
     * 最大token数（可选）
     * 控制AI响应的最大长度
     */
    @JsonProperty("max_tokens")
    private Integer maxTokens;

    /**
     * 是否启用流式响应（可选）
     * true: 实时返回生成的内容
     * false: 等待完整生成后一次性返回
     */
    @JsonProperty("stream")
    private Boolean stream = false;

    /**
     * 会话ID（可选）
     * 用于标识同一个对话会话，便于实现上下文对话
     */
    @JsonProperty("session_id")
    private String sessionId;

    /**
     * 用户ID（可选）
     * 用于标识不同的用户，便于实现个性化服务
     */
    @JsonProperty("user_id")
    private String userId;

    /**
     * 自定义构造函数：只传入消息内容
     * 这是最常用的构造方式
     *
     * @param message 用户消息
     */
    public ChatRequest(String message) {
        this.message = message;
    }

    /**
     * 自定义构造函数：传入消息和模型
     *
     * @param message 用户消息
     * @param model   指定的模型
     */
    public ChatRequest(String message, String model) {
        this.message = message;
        this.model = model;
    }

    /**
     * 检查请求是否有效
     *
     * @return true if valid, false otherwise
     */
    public boolean isValid() {
        return message != null && !message.trim().isEmpty();
    }

    /**
     * 获取实际使用的温度值
     * 如果没有设置，返回默认值0.7
     *
     * @return 温度值
     */
    public double getEffectiveTemperature() {
        return temperature != null ? temperature : 0.7;
    }

    /**
     * 获取实际使用的最大token数
     * 如果没有设置，返回默认值1000
     *
     * @return 最大token数
     */
    public int getEffectiveMaxTokens() {
        return maxTokens != null ? maxTokens : 1000;
    }

    /**
     * 是否启用流式响应
     *
     * @return true if stream enabled
     */
    public boolean isStreamEnabled() {
        return stream != null && stream;
    }
}
